package com.andy.note.main.wildcardsbounds;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/**
 * 
 * 
 *
 * @author Andy<908119428@qq.com>
 * @version $Revision: 1.1 $ $Date: 2021年6月28日 上午9:53:07 $
 */
public class TestWildcardsBounds {

//    参考链接
//    https://www.cnblogs.com/chenxibobo/p/9655236.html
//
//    上界<? extends T>不能往里存，只能往外取，频繁往外读取内容的，适合用上界Extends。
//    下界<? super T> 经常往里插入的，适合用下界Super。
//
//    总结
//    extends 可用于返回类型限定，不能用于参数类型限定（换句话说：? extends xxx 只能用于方法返回类型限定，jdk能够确定此类的最小继承边界为xxx，只要是这个类的父类都能接收，但是传入参数无法确定具体类型，只能接受null的传入）。
//    super 可用于参数类型限定，不能用于返回类型限定（换句话说：? supper xxx 只能用于方法传参，因为jdk能够确定传入为xxx的子类，返回只能用Object类接收）。
//    ? 既不能用于方法参数传入，也不能用于方法返回。
    
    public static void main(String[] args) {
        List<? extends Father> list1 = new ArrayList<Father>();
        List<? extends Father> list2 = new ArrayList<Son>();
        List<? extends Father> list3 = new ArrayList<LeiFeng>();
        List<? extends Father> list4 = getFatherList();
        list4.get(1).toString();

    }

    /**
     * @return
     */
    private static List<? extends Father> getFatherList() {
        List<Son> list = new ArrayList<Son>(); 
        list.add(new Son());
        list.add(new Son());
        list.add(new Son());
        return list;
    }
}
class Human{
}
class Father extends Human{
}
class Son extends Father{
    @Override
    public String toString() {
        System.out.println(new Random().nextInt());
        return super.toString();
    }
}
class LeiFeng extends Father {
}

